//! # 错误处理策略模块
//!
//! 重新导出 rustcloud-resilience 模块的错误处理功能，
//! 为 rustcloud-stream 提供统一的错误处理策略。
//! 
//! 通过这种方式保持向后兼容性，同时使用公共功能模块。

// 重新导出 rustcloud-resilience 的错误处理功能
pub use rustcloud_resilience::error_handling::*;

// 为流处理定制的错误处理策略
use async_trait::async_trait;
use crate::core::{StreamMessage, StreamResult};

/// 流处理专用错误处理策略
pub struct StreamErrorHandler {
    /// 底层错误处理器
    inner: Box<dyn rustcloud_resilience::error_handling::ErrorHandler>,
}

impl StreamErrorHandler {
    /// 创建新的流错误处理器
    pub fn new(inner: Box<dyn rustcloud_resilience::error_handling::ErrorHandler>) -> Self {
        Self { inner }
    }

    /// 处理流消息错误
    pub async fn handle_stream_error(
        &self,
        message: &StreamMessage,
        error: &crate::error::StreamError,
    ) -> StreamResult<ErrorAction> {
        // 将流错误转换为通用错误
        let generic_error = rustcloud_resilience::error_handling::GenericError::new(
            "STREAM_ERROR".to_string(),
            error.to_string(),
            std::collections::HashMap::new(),
        );

        // 使用底层错误处理器
        self.inner.handle_error(&generic_error).await
            .map_err(|e| crate::error::StreamError::ErrorHandling(e.to_string()))
    }
}

#[async_trait]
impl rustcloud_resilience::error_handling::ErrorHandler for StreamErrorHandler {
    async fn handle_error(
        &self,
        error: &rustcloud_resilience::error_handling::GenericError,
    ) -> rustcloud_resilience::error_handling::Result<ErrorAction> {
        self.inner.handle_error(error).await
    }
}

/// 流处理错误策略配置
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
pub struct StreamErrorConfig {
    /// 最大重试次数
    pub max_retries: u32,
    /// 重试间隔（毫秒）
    pub retry_interval_ms: u64,
    /// 是否启用死信队列
    pub enable_dlq: bool,
    /// 死信队列主题
    pub dlq_topic: Option<String>,
}

impl Default for StreamErrorConfig {
    fn default() -> Self {
        Self {
            max_retries: 3,
            retry_interval_ms: 1000,
            enable_dlq: true,
            dlq_topic: None,
        }
    }
}

#[cfg(test)]
mod tests {
    use super::*;
    
    #[tokio::test]
    async fn test_stream_error_config_default() {
        let config = StreamErrorConfig::default();
        assert_eq!(config.max_retries, 3);
        assert_eq!(config.retry_interval_ms, 1000);
        assert!(config.enable_dlq);
        assert!(config.dlq_topic.is_none());
    }
}
